#ifndef _DEV_KEY_H
#define _DEV_KEY_H

// 本驱动最多支持8个按键
// 按键共阴

#include "device_conf.h"

// 按键引脚定义
#ifdef STM32F10X
#include "stm32f10x.h"

#define KEY_RCC_APBx                    RCC_APB2Periph_GPIOA	//定义OLED端口时钟总线
#define KEY_RCC_APBx_CMD(APBx, state)   RCC_APB2PeriphClockCmd(APBx, state)
#define KEY_GPIOx                       GPIOA
#define KEY0		                    GPIO_Pin_8
#define KEY1		                    GPIO_Pin_9
#define KEY2		                    GPIO_Pin_10
#define KEY3		                    GPIO_Pin_11
//#define KEY4		                    GPIO_Pin_8
//#define KEY5		                    GPIO_Pin_9
//#define KEY6		                    GPIO_Pin_10
//#define KEY7		                    GPIO_Pin_11
#define KEY_GPIO_Pin                    (KEY0 | KEY1 | KEY2 | KEY3)

// 获取按键IO口状态
#define READ_KEY0                       GPIO_ReadInputDataBit(KEY_GPIOx, KEY0)
#define READ_KEY1                       GPIO_ReadInputDataBit(KEY_GPIOx, KEY1)
#define READ_KEY2                       GPIO_ReadInputDataBit(KEY_GPIOx, KEY2)
#define READ_KEY3                       GPIO_ReadInputDataBit(KEY_GPIOx, KEY3)
#define READ_KEY4                       1
#define READ_KEY5                       1
#define READ_KEY6                       1
#define READ_KEY7                       1
#endif

#define KEY0_ON     (1 << 0)
#define KEY1_ON     (1 << 1)
#define KEY2_ON     (1 << 2)
#define KEY3_ON     (1 << 3)
#define KEY4_ON     (1 << 4)
#define KEY5_ON     (1 << 5)
#define KEY6_ON     (1 << 6)
#define KEY7_ON     (1 << 7)

void key_init(void); // 按键初始化
void key_tim_check(uint32 tim_freq, f32 time); // 按键长按检测（此函数用于定时器中断中）
uint8 key_scan(uint16 time); // 按键扫描：返回1byte数据，每个bit代表一个按键位，time: 长按触发时间
uint8 key_tim_scan(uint32 tim_freq, f32 time, uint8 key_value_check); // 按键长按检测（此函数用于定时器中断中）

#endif
